﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZOVNP.Model.Abstracts
{
    /// <summary> Интерфейс для классов, реализующих навигационные свойства между доменными объектами. </summary>
    /// <remarks>
    /// Существуют определенные особенности работы с навигационными свойствами.
    /// Первая особенность в их загрузке по требованию: требуемое навигационное свойство загружается (отправляет запрос в хранилище объектов) только в тот момент, когда разыменовывается.
    /// Вторая особенность в том, что однажды загруженное навигационное свойство кэшируется для последующих обращений и повторные запросы в хранилище не отправляются.
    /// Третья особенность в том, что для первоначальной загрузки навигационного свойства объектв, его содержащий, должен принадлежать некоторому контексту (песочнице),
    /// в рамках которой будет прокешировано загруженное навигационное свойство. </remarks>
    public interface IDomainRelation
    {
        /// <summary> Получить значение навигационного свойства. </summary>
        /// <remarks> 
        /// Значение навигационного свойства зависит от типа навигации (1 к многим, многие к 1, 1 к 1 и тд)
        /// и может возвращать либо ссылку на единичный объект, либо ссылку на коллекцию объектов. В случае
        /// если возвращается ссылка на объект, то она может иметь значение null. Если же возвращается ссылка
        /// на коллекцию объектов, и эта коллекция пуста, то свойство содержит экземпляр пустой коллекции. 
        /// </remarks>
        //object Navigation { get; }
        /// <summary> Событие по добавлению/удалению элементов в навигационном свойстве. </summary>
        //event System.ComponentModel.CollectionChangeEventHandler AssociationChanged;
        /// <summary> Получить признак того, что навигационное свойство уже было загружено из базы данных. </summary>
        bool IsLoaded { get; }
        /// <summary> Загрузить навигационное свойство. </summary>
        /// <remarks> Загрузка навигационных свойств не поддерживается в состоянии <c>Added</c>, вызов метода не даст никакого эффекта. </remarks>
        void Load();
    }
}
